#include <stdio.h>
#include "network.h"

/**
 * @file   bfsNet.c
 * @Author Pellegrini Franco (frapell@gmail.com)
 * @date   Abril, 2011
 * @brief  Main
 *
 */

/** @mainpage Página principal
 *
 * \section intro_sec Introducción
 *
 * Proyecto para la materia Matemática Discreta 2 de la Facultad de Matemática,
 * Astronomía y Física de la Universidad Nacional de Córdoba.
 *
 * \section desc_sec Descripción
 *
 * El proyecto se basa en implementar un programa que parsea un network por
 * línea de comando.
 *
 * Devuelve el camino más corto y su capacidad máxima, en caso de hallarse.
 * Caso contrario devuelve un mensaje indicando que no existe un camino.
 *
 * \subsection desiciones_sec Decisiones de Diseño
 *
 * El diseño es muy sencillo y no es necesaria mucha explicacion.
 *
 * En cuanto a la implementacion de las estructuras, se implementó todo en
 * un solo archivo, ya que son estructuras íntimamente relacionadas entre sí.
 *
 * En cuanto a la implementación de la búsqueda del camino, se implementó
 * de manera muy similar a la vista en clase con Edmonds-Karp.
 *
 * Primero se recorren los nodos en "modo forward" agregandolos a un campo
 * auxiliar de la estructura Path (nodos), indicando las capacidades minimas
 * y el padre (para indicar el padre, se almacena (en el campo "padre"), el
 * indice en donde el padre se encuentra en el campo "nodos").
 *
 * Una vez alcanzado el "sink", se procede a recorrer los nodos en reverso,
 * es decir, viendo que nodo agregó a cual, y se carga el camino bfs ya si,
 * en el campo bfs de la estructura.
 *
 * Por ultimo, la funcion que imprime el resultado en pantalla, también se
 * encuentra en el mismo archivo. Y es la que se encarga de imprimir en la
 * consola, el resultado de la ejecución.
 *
 * \subsection testing_sec Networks de testeo
 *
 * Los archivos con los networks de testeo se incluyen con el mismo programa.
 *
 * Son:
 *
 * \li \c nodos
 * \li \c noend
 * \li \c numericogrande
 * \li \c numericosimple
 * 
 */


int main(void){

    u32 nodoa = 0;
    u32 nodob = 0;
    u32 capacidad = 0;
    int result = 3;
    int ch = 0;
    Network network = NULL;
    Path path = NULL;

    network = crear_network();

    while (result == 3){
        result = scanf("%u %u %u", &nodoa, &nodob, &capacidad);
        /*
        La linea de abajo me permite hacer flush del sobrante del input
        */
        while ((ch = getchar()) != '\n' && ch != EOF);
        
        if (result == 3){
            /*
             * Tengo una linea de entrada correcta, cargo la data en mi
             * estructura
             */
            agregar_lado(network, nodoa, nodob, capacidad);
        }
    }

    /*
     * En este punto tengo toda mi network cargado, genero el path
     */

    path = crear_path(network);

    /*
     * Solo resta imprimir el camino y el flujo
     */
    imprimir_camino_y_flujo(path);
    
    /*
     * Libero y salgo
     */
    destruir_network(network);
    destruir_path(path);
    return 0;
    
}